package com.shujia.wyh.day26;

/*
        分析线程间通信的案例：
            共有资源类：Student
            生产者：SetThread 给学生对象进行赋值
            消费者：GetThread 给学生对象进行取值
            测试类：StudentDemo

        问题1：
            按照我们分析类思路来写程序，运行后发现每一次运行的结果都是null--0
            这是必然，因为我们在每一个线程类中都单独new了一次学生对象
            ，而我们实际上赋值和取值的对象应该是同一个。
            所以不应该在内部定义。
            怎么解决呢？
                应该在外部把学生对象定义出来，然后使用构造方法的形式进行传参。

       问题2：
            我们为了运行出来的数据好看一点，在程序加入了循环和判断，赋值的时候，赋不同的值。
            但是呢，在运行的时候，又出现了新的问题。
            1、姓名和年龄不匹配
            2、同一个数据出现了多次（消费者消费了多次）
         原因：
            1）、姓名和年龄不匹配
                这是由线程执行具有随机性导致的
            2）、同一个数据出现了多次（消费者消费了多次）
                由于CPU一个小小的时间片就足矣我们线程执行很多次
         线程安全的问题：
            1、是否有多线程环境，是 一个生产者，一个消费者
            2、是否有共享数据，是  Student
            3、是否有多条语句操作着共享数据 是

         既然都满足，那么就说明有线程安全问题。
         解决方案：
            加锁。
            注意：
            1、不同种类的线程类中都要加锁
            2、并且不同种类的线程类中的锁对象必须是同一个（指的是线程对象共同拥有一个锁对象）





 */
public class StudentDemo {
    public static void main(String[] args) {
        //定义一个共享的资源
        Student student = new Student();

        //创建Runnable对象
        SetThread setThread = new SetThread(student);
        GetThread getThread = new GetThread(student);

        //借助Thread类创建线程对象
        Thread t1 = new Thread(setThread, "生产者");
        Thread t2 = new Thread(getThread, "消费者");

        //启动线程
        t1.start();
        t2.start();
    }
}
